package com.ailsa.learningsystem.dao.impl;

import com.ailsa.learningsystem.dao.CourseDao;
import com.ailsa.learningsystem.pojo.Course;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author 冉冉
 * @Version 1.0
 */

public class CourseDaoImpl implements CourseDao {
    /**
     *查询全部的课程的信息
     * @return
     */
    @Override
    public List<Course> getAllCourse() {
        //声明对象流的对象
        ObjectInputStream ois=null;
        List<Course> list=null;
        try{
            ois=new ObjectInputStream(new FileInputStream("course.bat"));
            list=( List<Course>)ois.readObject();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                ois.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return list;
    }
    /**
     * 根据课程类别查询课程的信息
     * @param courseType
     * @return
     */
    @Override
    public List<Course> getCourseByType(String courseType) {
        //调用查询全部的课程的信息
        List<Course> list = getAllCourse();
        //创建集合对象
        List<Course> listType=new ArrayList<>();
        //遍历集合
        for (Course course:list) {
            //如果类别与输入类别是相同的，存储到类别集合中
            if(courseType.equals(course.getCourseType())){
                //将添加到类别集合中
                listType.add(course);
            }

        }
        return listType;
    }
    /**
     *根据ID查询课程信息
     * 参数类型：int类型，ID是不允许重复【一般情况下】
     * 返回值类型：课程信息
     */
    @Override
    public Course getCourseById(int courseId) {
        //获取到所有的课程
        List<Course> list = getAllCourse();
        //创建课程信息的对象
        Course course=new Course();
        //循环遍历所有的课程的信息list集合
        for (Course c:list) {
            if(c.getCourseId()==courseId){
                course=c;
            }
        }
        return course;
    }
    /**
     * 根据课程名称查询课程信息
     * @param courseName
     * @return
     * 集合创建法：菱形创建法，JDK1.7出现，不能使用菱形创建法
     */
    @Override
    public List<Course> getCourseByName(String courseName) {
        //调用全部查询课程信息
        List<Course> list = getAllCourse();
        //创建新的集合
        List<Course> courseNameList=new ArrayList<>();
        for (Course course:list) {
            if(course.getCourseName().equals(courseName)){
                courseNameList.add(course);
            }
        }
        return courseNameList;
    }

    /**
     * 发布课程
     * 添加数据：
     *  1.课程编号【一般不需要手动写，自动生成，集合的下标自增长】，数据库的自增长，雪花算法，UUID，订单号：非常长，一般雪花算法
     *  2.课程的名称
     *      2.1：课程名称允许重复
     *      2.2：课程名称不允许重复
     *  3.课程类型
     *  4.课程总课时
     *  5.课程时长
     *  6.课程主讲老师
     */
    @Override
    public void addCourse(Course course) {
        boolean flag=false;//设置一个标记
        //获取查询所有课程的信息
        List<Course> list = getAllCourse();
            for (Course course1:list) {
                if(course1.getCourseName().equals(course.getCourseName())){
                    flag=true;
                    break;
                }
            }

        if(!flag){
            //获取新的课程编号，不需要手动输入,通过获取查询所有课程的信息的最后一个元素的编号
            //get使用是下标，获取最后元素的ID，在最后一个元素的ID上+1=最新的ID
            int courseId=list.get(list.size()-1).getCourseId()+1;
            course.setCourseId(courseId);
            //将新的课程保存在集合中
            list.add(course);
            //将新的集合保存在文件中
            saveCourse(list);
            System.out.println("发布课程成功");
        }

    }
    /**
     * 将集合保存文件中
     */
    private void saveCourse(List<Course> list){
        //声明流的对象
        ObjectOutputStream objectOutputStream=null;
        try {
            objectOutputStream=new ObjectOutputStream(new FileOutputStream("course.bat"));
            //写对象
            objectOutputStream.writeObject(list);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                objectOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    /**
     * 根据课程名称或者课程类型查询课程的信息
     * @param courseName  课程名称
     * @param courseType  课程类型
     * @return
     */
    @Override
    public List<Course> getCourseByNameType(String courseName, String courseType) {
        //获取所有课程的信息
        List<Course> list = getAllCourse();
        List<Course> courseList=new ArrayList<>();
        for (Course course:list) {
            if(course.getCourseName().equals(courseName)&&course.getCourseType().equals(courseType)){
                courseList.add(course);
            }
        }
        return courseList;
    }
    /**
     * 根据课程的ID删除课程的信息
     * @param courseId
     */
    @Override
    public void deleteCourse(int courseId) {
        //根据编号获取对象的方法
        int check = check(courseId);
        if(check==-1){
            System.out.println("对不起，没有要删除的课程");
        }else{
            List<Course> list = getAllCourse();
            //将课程编号所对应的课程信息进行删除
            list.remove(check);
            //重新保存数据
            saveCourse(list);
            System.out.println("删除课程成功");
        }
    }

    /**
     * 验证课程编号是否存在
     * @param courseId 课程编号
     * @return
     */
    private int check(int courseId){
        int index=-1;
        //调用查询全部课程的信息
        List<Course> list = getAllCourse();
        for (int i=0;i<list.size();i++) {
            if(courseId==list.get(i).getCourseId()){
                index=i;
                break;
            }
        }
        return index;
    }
}
